package inge_soft.gestoriusNuevo.persistence.DAO.implementation;

import java.util.Date;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import javax.persistence.TemporalType;

import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import inge_soft.gestoriusNuevo.persistence.DAO.Exceptions.Abstraction.GestoriusException;
import inge_soft.gestoriusNuevo.persistence.DAO.Exceptions.Implementation.SolicitudOrganizadorInexistenteException;
import inge_soft.gestoriusNuevo.persistence.DAO.abstraction.ISolicitudOrganizadorDAO;
import inge_soft.gestoriusNuevo.persistence.entity.implementation.SolicitudOrganizador;
import inge_soft.gestoriusNuevo.persistence.entity.implementation.Usuario;
import inge_soft.gestoriusNuevo.persistence.entity.implementation.UsuarioRegistrado;
import inge_soft.gestoriusNuevo.support.Global;


@Repository("solicitudOrganizadorDAO")
public class SolicitudOrganizadorDAO implements ISolicitudOrganizadorDAO {

	
	@PersistenceContext
	private EntityManager entityManager;

	@Transactional(propagation = Propagation.MANDATORY)
	public void crear(SolicitudOrganizador soliUsu) throws GestoriusException {
		// TODO Auto-generated method stub
		entityManager.persist(soliUsu);
	}

	@Transactional(propagation = Propagation.MANDATORY)
	public void modificar(SolicitudOrganizador soliUsu)
			throws GestoriusException {
		// TODO Auto-generated method stub
		entityManager.merge(soliUsu);
	}

	@Transactional(propagation = Propagation.MANDATORY)
	public void eliminar(SolicitudOrganizador soliUsu)
			throws GestoriusException {
		// TODO Auto-generated method stub

	}
	
	@Transactional(readOnly = true)
	public SolicitudOrganizador findById(Long idSol)
			throws SolicitudOrganizadorInexistenteException {

		SolicitudOrganizador resultado = null;
		String query = "SELECT s FROM SolicitudOrganizador s where s.id = :idSol";

		Query qSolOrg = entityManager.createQuery(query).setParameter("idSol",
				idSol);
		resultado = (SolicitudOrganizador) qSolOrg.getSingleResult();
		if (resultado == null) {
			throw new SolicitudOrganizadorInexistenteException(
					"Solicitud no encontrada");
		}

		return resultado;
	}

	@Transactional(readOnly = true)
	public List<SolicitudOrganizador> findAll(int estado)
			throws SolicitudOrganizadorInexistenteException {

		List<SolicitudOrganizador> resultado = null;
		String query = "SELECT s FROM SolicitudOrganizador s where s.estado = :estado";

		Query qSolOrg = entityManager.createQuery(query).setParameter("estado",
				estado);
		resultado = (List<SolicitudOrganizador>) qSolOrg.getResultList();
		if (resultado.size() == 0) {
			throw new SolicitudOrganizadorInexistenteException(
					"Ninguna solicitud con el estado: "
							+ Global.getEstadoSolicitud(estado));
		}

		return resultado;
	}

	@Transactional(readOnly = true)
	public List<SolicitudOrganizador> findAll()
			throws SolicitudOrganizadorInexistenteException {

		List<SolicitudOrganizador> resultado = null;
		String query = "SELECT s FROM SolicitudOrganizador s";

		Query qSolOrg = entityManager.createQuery(query);
		resultado = (List<SolicitudOrganizador>) qSolOrg.getResultList();
		if (resultado.size() == 0) {
			throw new SolicitudOrganizadorInexistenteException(
					"Ninguna solicitud encontrada");
		}

		return resultado;
	}

	@Transactional(readOnly = true)
	public List<SolicitudOrganizador> findAll(Date fechaInicio, Date fechaFinal)
			throws SolicitudOrganizadorInexistenteException {

		List<SolicitudOrganizador> resultado = null;
		String query = "SELECT s FROM SolicitudOrganizador s WHERE s.fechaSolicitud BETWEEN :fechaInicio AND :fechaFinal";

		Query qSolOrg = entityManager.createQuery(query);
		qSolOrg.setParameter("fechaInicio", fechaInicio, TemporalType.DATE);
		qSolOrg.setParameter("fechaFinal", fechaFinal, TemporalType.DATE);
		resultado = (List<SolicitudOrganizador>) qSolOrg.getResultList();
		if (resultado.size() == 0) {
			throw new SolicitudOrganizadorInexistenteException(
					"Ninguna solicitud encontrada");
		}

		return resultado;
	}

	@Transactional(readOnly = true)
	public List<SolicitudOrganizador> findAll(int estado, Date fechaInicio,
			Date fechaFinal) throws SolicitudOrganizadorInexistenteException {

		List<SolicitudOrganizador> resultado = null;
		String query = "SELECT s FROM SolicitudOrganizador s WHERE s.estado = :estado AND s.fechaSolicitud BETWEEN :fechaInicio AND :fechaFinal";

		Query qSolOrg = entityManager.createQuery(query);
		qSolOrg.setParameter("estado", estado);
		qSolOrg.setParameter("fechaInicio", fechaInicio, TemporalType.DATE);
		qSolOrg.setParameter("fechaFinal", fechaFinal, TemporalType.DATE);
		resultado = (List<SolicitudOrganizador>) qSolOrg.getResultList();
		if (resultado.size() == 0) {
			throw new SolicitudOrganizadorInexistenteException(
					"Ninguna solicitud encontrada");
		}

		return resultado;
	}
	@Transactional(readOnly = true)
	public boolean tieneSolicitudPendiente(int estado , Usuario user){
		int resultado;
		String query = "SELECT COUNT(*) FROM SolicitudOrganizador s WHERE s.estado = :estado AND s.usuarioSolicitante = :user";
		Query qsol = entityManager.createQuery(query);
		qsol.setParameter("estado", estado).setParameter("user",user);
		resultado =  Integer.valueOf(String.valueOf(qsol.getSingleResult()));
		
		if(resultado >= 1){
			return false;
		}
		return true;
		
	}
	
}
